package com.ww.jmh;

import com.google.common.base.Stopwatch;
import com.google.common.base.Strings;

import java.util.List;
import java.util.concurrent.TimeUnit;

public class JmhApp {
    /**
     * 测试数据
     */
    private final static String DATA = "用来测试的数据";
    /**
     * 测试次数
     */
    private final static int TEST_COUNT = 1000000;
    /**
     * 测试迭代次数
     */
    private final static int MAX_ITERATIONS = 10;

    /**
     * 测试方法
     *
     * @param list
     */
    private static void test(List<String> list) {
        for (int i = 0; i < TEST_COUNT; i++) {
            list.add(DATA);
        }
    }

    /**
     * 测试 ArrayList 的性能
     *
     * @param iterations
     */
    private static void arrayListPerfTest(int iterations) {
        for (int i = 0; i < iterations; i++) {
            final List<String> list = new java.util.ArrayList<>();
            final Stopwatch stopwatch = Stopwatch.createStarted();
            test(list);
            System.out.println(new StringBuilder().append("ArrayList第 ").append(i + 1)
                    .append(" 次循环add操作").append(TEST_COUNT).append("次耗费时间为：")
                    .append(stopwatch.stop().elapsed(TimeUnit.MILLISECONDS)).append("毫秒"));
        }
    }

    private static void linkedListPerfTest(int iterations) {
        for (int i = 0; i < iterations; i++) {
            final List<String> list = new java.util.LinkedList<>();
            final Stopwatch stopwatch = Stopwatch.createStarted();
            test(list);
            System.out.println(new StringBuilder().append("LinkedList第 ").append(i+1)
                    .append(" 次循环add操作").append(TEST_COUNT).append("次耗费时间为：")
                    .append(stopwatch.stop().elapsed(TimeUnit.MILLISECONDS)).append("毫秒"));
        }
    }

//    ArrayList第 1 次循环add操作1000000次耗费时间为：14毫秒
//    ArrayList第 2 次循环add操作1000000次耗费时间为：12毫秒
//    ArrayList第 3 次循环add操作1000000次耗费时间为：11毫秒
//    ArrayList第 4 次循环add操作1000000次耗费时间为：22毫秒
//    ArrayList第 5 次循环add操作1000000次耗费时间为：8毫秒
//    ArrayList第 6 次循环add操作1000000次耗费时间为：8毫秒
//    ArrayList第 7 次循环add操作1000000次耗费时间为：8毫秒
//    ArrayList第 8 次循环add操作1000000次耗费时间为：36毫秒
//    ArrayList第 9 次循环add操作1000000次耗费时间为：8毫秒
//    ArrayList第 10 次循环add操作1000000次耗费时间为：8毫秒
//    ################################################
//    LinkedList第 1 次循环add操作1000000次耗费时间为：13毫秒
//    LinkedList第 2 次循环add操作1000000次耗费时间为：96毫秒
//    LinkedList第 3 次循环add操作1000000次耗费时间为：4毫秒
//    LinkedList第 4 次循环add操作1000000次耗费时间为：4毫秒
//    LinkedList第 5 次循环add操作1000000次耗费时间为：8毫秒
//    LinkedList第 6 次循环add操作1000000次耗费时间为：11毫秒
//    LinkedList第 7 次循环add操作1000000次耗费时间为：8毫秒
//    LinkedList第 8 次循环add操作1000000次耗费时间为：7毫秒
//    LinkedList第 9 次循环add操作1000000次耗费时间为：7毫秒
//    LinkedList第 10 次循环add操作1000000次耗费时间为：7毫秒
    public static void main(String[] args) {
        arrayListPerfTest(MAX_ITERATIONS);
        System.out.println(Strings.repeat("#", 48));
        linkedListPerfTest(MAX_ITERATIONS);
    }
}
